package dao

import (
	"fmt"
	"time"
	"user_srv/basic/config"
	"user_srv/handler/models"
)

// GetExportData 获取指定类型的数据用于导出
// dataType: 数据类型，如"user"、"invoice"、"consumption"
// startDate: 开始日期字符串，格式为"2006-01-02"
// endDate: 结束日期字符串，格式为"2006-01-02"
// userIds: 用户ID列表，用于过滤特定用户的数据
// 返回值: 成功返回查询到的数据（根据dataType不同返回不同类型的切片），失败返回错误
func GetExportData(dataType string, startDate, endDate string, userIds []int64) (interface{}, error) {
	// 解析日期范围
	var startTime, endTime time.Time
	var err error

	if startDate != "" {
		startTime, err = time.Parse("2006-01-02", startDate)
		if err != nil {
			return nil, fmt.Errorf("无效的开始日期格式: %w", err)
		}
	}

	if endDate != "" {
		endTime, err = time.Parse("2006-01-02", endDate)
		if err != nil {
			return nil, fmt.Errorf("无效的结束日期格式: %w", err)
		}
		// 将结束日期设置为当天的最后一刻
		endTime = endTime.Add(24*time.Hour - time.Second)
	}

	// 根据数据类型查询数据
	switch dataType {
	case "user":
		return getUserData(startTime, endTime, userIds)
	case "invoice":
		return getInvoiceData(startTime, endTime, userIds)
	case "consumption":
		return getConsumptionData(startTime, endTime, userIds)
	default:
		return nil, fmt.Errorf("不支持的数据类型: %s", dataType)
	}
}

// getUserData 获取用户数据
// startTime: 开始时间，过滤注册时间大于等于此时间的用户
// endTime: 结束时间，过滤注册时间小于等于此时间的用户
// userIds: 用户ID列表，过滤特定用户
// 返回值: 成功返回用户数据切片，失败返回错误
func getUserData(startTime, endTime time.Time, userIds []int64) ([]models.User, error) {
	var users []models.User
	query := config.DB

	// 应用日期过滤
	if !startTime.IsZero() {
		query = query.Where("user_register_time >= ?", startTime)
	}
	if !endTime.IsZero() {
		query = query.Where("user_register_time <= ?", endTime)
	}

	// 应用用户ID过滤
	if len(userIds) > 0 {
		query = query.Where("id IN ?", userIds)
	}

	// 查询数据
	if err := query.Find(&users).Error; err != nil {
		return nil, fmt.Errorf("查询用户数据失败: %w", err)
	}

	return users, nil
}

// getInvoiceData 获取发票数据
// startTime: 开始时间，过滤创建时间大于等于此时间的发票
// endTime: 结束时间，过滤创建时间小于等于此时间的发票
// userIds: 用户ID列表，过滤特定用户的发票
// 返回值: 成功返回发票数据切片，失败返回错误
func getInvoiceData(startTime, endTime time.Time, userIds []int64) ([]models.Invoice, error) {
	var invoices []models.Invoice
	query := config.DB

	// 应用日期过滤
	if !startTime.IsZero() {
		query = query.Where("created_at >= ?", startTime)
	}
	if !endTime.IsZero() {
		query = query.Where("created_at <= ?", endTime)
	}

	// 查询数据
	if err := query.Find(&invoices).Error; err != nil {
		return nil, fmt.Errorf("查询发票数据失败: %w", err)
	}

	return invoices, nil
}

// getConsumptionData 获取消费记录数据
// startTime: 开始时间，过滤价格时间大于等于此时间的消费记录
// endTime: 结束时间，过滤价格时间小于等于此时间的消费记录
// userIds: 用户ID列表，过滤特定用户的消费记录
// 返回值: 成功返回消费记录数据切片，失败返回错误
func getConsumptionData(startTime, endTime time.Time, userIds []int64) ([]models.UserConsumptionInformation, error) {
	var consumptions []models.UserConsumptionInformation
	query := config.DB

	// 应用日期过滤
	if !startTime.IsZero() {
		query = query.Where("price_time >= ?", startTime)
	}
	if !endTime.IsZero() {
		query = query.Where("price_time <= ?", endTime)
	}

	// 应用用户ID过滤
	if len(userIds) > 0 {
		query = query.Where("user_id IN ?", userIds)
	}

	// 查询数据
	if err := query.Find(&consumptions).Error; err != nil {
		return nil, fmt.Errorf("查询消费记录数据失败: %w", err)
	}

	return consumptions, nil
}
